在 Kanzi 中,您可以创建这样的关键帧动画:
您可以通过以下方式为关键帧动画创建动画数据:
要使用 Kanzi Engine API 创建关键帧动画,请参阅 使用 Kanzi Engine API 创建动画和时间线。
要为节点属性创建关键帧动画,请执行以下操作:
要为目标属性特性创建关键帧动画,请执行以下操作:
要创建关键帧动画:
//创建一个浮点关键帧动画。 FloatKeyframeAnimationSharedPtr keyframeAnimation = FloatKeyframeAnimation::create(domain); //创建关键帧并将它们添加到关键帧动画中。关键帧动画包含 2 个线性关键帧。 //在 0 秒处创建一个值为 0 的线性关键帧。 keyframeAnimation->addLinearKeyframe(chrono::seconds::zero(), 0.0f); //在 1 秒处创建一个值为 100 的线性关键帧。 keyframeAnimation->addLinearKeyframe(chrono::seconds(1), 100.0f);
要使用关键帧动画动画化节点中的某个属性值:
//创建一个属性时间线并将 keyframeAnimation 关键帧动画应用于布局宽度 (Layout Width) 属性, //以动画化当前节点的宽度。 PropertyAnimationTimelineSharedPtr propertyTimeline = PropertyAnimationTimeline::create(domain, ".", Node2D::WidthProperty, keyframeAnimation);
要使用关键帧动画动画化节点中的某个属性字段值:
//创建一个属性字段动画时间线并将其应用于当前节点的渲染变换 (Render Transformation) 属性。 PropertyFieldAnimationTimelineSharedPtr propertyFieldTimeline = PropertyFieldAnimationTimeline::create(domain, ".", Node2D::RenderTransformationProperty); //使用 keyframeAnimation 关键帧动画对渲染变换 (Render Transformation) 属性的旋转 Z (Rotation Z) 属性字段进行动画化, //以旋转当前节点。 propertyFieldTimeline->addEntry(PropertyFieldRotationZ, keyframeAnimation);
要创建一个使用贝塞尔曲线关键帧在 8 字形路径上移动对象的关键帧动画:
//创建两个浮点关键帧动画:一个用于动画化 x 轴上的对象, //另一个用于动画化 y 轴上的对象。 //创建使用线性关键帧的浮点关键帧动画 keyframeAnimationX, //以动画化 x 轴上对象的移动。 FloatKeyframeAnimationSharedPtr keyframeAnimationX = FloatKeyframeAnimation::create(domain); //在 0 秒处创建一个值为 0 的线性关键帧。 keyframeAnimationX->addLinearKeyframe(chrono::seconds::zero(), 0.0f); //在 4 秒处创建一个值为 4 的线性关键帧。 //在关键帧处,对象在 x 轴上达到最远的点。 keyframeAnimationX->addLinearKeyframe(chrono::seconds(4), 4.0f); //在 8 秒处创建一个值为 0 的线性关键帧。 //在关键帧处,对象将回到它在第一个关键帧处所处的那个位置。 keyframeAnimationX->addLinearKeyframe(chrono::seconds(8), 0.0f); //创建使用贝塞尔曲线关键帧的浮点关键帧 keyframeAnimationY, //以在动画化 y 轴上对象的移动。 FloatKeyframeAnimationSharedPtr keyframeAnimationY = FloatKeyframeAnimation::create(domain); //在 0 秒处创建一个值为 0 的线性关键帧。当使用贝塞尔曲线关键帧时, //您可以对第一个关键帧使用任何类型的关键帧,原因在于您只需要 //让关键帧提供有关开始位置的信息。 keyframeAnimationY->addLinearKeyframe(chrono::seconds::zero(), 0.0f); //在 4 秒处创建一个值为 0 并具有两个控制点的贝塞尔曲线关键帧。 //您可以使用控制点设置关键帧的位置。 keyframeAnimationY->addBezierKeyframe(chrono::seconds(4), 0.0f, Vector2(0.5f, 4.0f), Vector2(0.5f, -4.0f)); //在 8 秒处创建一个值为 0 并具有两个控制点的贝塞尔曲线关键帧。 //关键帧使用相同的控制点,但由于 keyframeAnimationX //动画将 x 轴上的对象移回到其开始位置,因此关键帧 //是上一个关键帧的镜像图像。 keyframeAnimationY->addBezierKeyframe(chrono::seconds(8), 0.0f, Vector2(0.5f, 4.0f), Vector2(0.5f, -4.0f)); //创建一个属性字段动画时间线并将其应用于当前节点的渲染变换 (Render Transformation) 属性。 PropertyFieldAnimationTimelineSharedPtr timeline = PropertyFieldAnimationTimeline::create(domain, ".", Node3D::RenderTransformationProperty); //使用 keyframeAnimationX 关键帧动画对渲染变换 (Render Transformation) 属性的平移 X (Translation X) 属性字段进行动画化, //以移动 x 轴上的当前节点。 timeline->addEntry(PropertyFieldTranslationX, keyframeAnimationX); //使用 keyframeAnimationY 关键帧动画对渲染变换 (Render Transformation) 属性的平移 Y (Translation Y) 属性字段进行动画化, //以移动 y 轴上的当前节点。 timeline->addEntry(PropertyFieldTranslationY, keyframeAnimationY);
要播放动画而不管时间线类型如何:
//为 item2d 中定义的节点创建回放上下文和时间线回放。 SceneGraphTimelinePlaybackContext context(*item2d); //为 propertyFieldTimeline 中定义的时间线创建回放。 TimelinePlaybackSharedPtr playback = propertyFieldTimeline->createPlayback(context); //开始执行动画化。 domain->getRootTimelineClock()->addTimelinePlayback(playback);
有关详细信息,请参阅 API reference 中的 KeyframeAnimation
类。